package studia.figlewicz.math.library;

import java.util.Date;
import java.util.Map;

public class PrzeplywOpcyjnyEuropejski extends PrzeplywPieniezny {
	
	public final static String[] instrumentyPodstawowe = {
		PrzeplywOpcyjnyEuropejski.CENA_INSTRUMENTU_PODSTAWOWEGO
	};
	public final static String CENA_INSTRUMENTU_PODSTAWOWEGO = Stale.PRZEPLYW_OPCYJNY_EUROPEJSKI_CENA_INSTRUMENTU_PODSTAWOWEGO;
	
	private Double strike;
	private TypOpcji typ = TypOpcji.CALL;
	
	
	// konstruktory
	public PrzeplywOpcyjnyEuropejski(Date dataPrzeplywu, Double strike, TypOpcji typ, Double nominal) {
		super(dataPrzeplywu, nominal);
		this.strike = strike;
		this.typ = typ;
	}
	
	
	// gettery i settery
	@Override
	public String[] getInstrumentyPodstawowe() {
		return PrzeplywOpcyjnyEuropejski.instrumentyPodstawowe;
	}
	public Double getStrike() {
		return strike;
	}
	public void setStrike(Double strike) {
		this.strike = strike;
	}
	public TypOpcji getTyp() {
		return typ;
	}
	public void setTyp(TypOpcji typ) {
		this.typ = typ;
	}
	public final static String getInstrumentPodstawowy1() {
		return instrumentyPodstawowe[0];
	};

	
	// metody
	@Override
	public StatystykaWyceny obliczWyplate(Map<String, TrajektoriaProcesu> projekcje) {
		StatystykaWyceny resoult = null;
		
		TrajektoriaProcesu wynikProjekcji = projekcje.get(CENA_INSTRUMENTU_PODSTAWOWEGO);

		if (wynikProjekcji != null)
			resoult = wyplataZTrajektorii(wynikProjekcji);
		
		return resoult;
	}
	
	
	// motody prywatne
	private StatystykaWyceny wyplataZTrajektorii(TrajektoriaProcesu trajektoriaCeny) {
		StatystykaWyceny resoult = new StatystykaWyceny();

		if (trajektoriaCeny != null) {
			double cena = trajektoriaCeny.znajdzWartosc(dataPrzeplywu).doubleValue();
			if (typ == TypOpcji.CALL)
				resoult.wartoscNominalna = new Double(Math.max(0, cena - strike));
			else
				resoult.wartoscNominalna = new Double(Math.max(0, strike - cena));
			
			double r = integral(stopaDyskonta, dataWyceny, dataPrzeplywu,1);
			double DF = 1 / (1 + r);
			resoult.wartoscRealna  = resoult.wartoscNominalna * DF;
			
			resoult.wartoscRealna = resoult.wartoscRealna.doubleValue() * nominal.doubleValue();
			resoult.wartoscNominalna = resoult.wartoscNominalna.doubleValue() * nominal.doubleValue();
		}
		
		return resoult;
	}


	


}
